//package com.opc.websocket;
//
//import org.springframework.stereotype.Component;
//
//import javax.websocket.OnClose;
//import javax.websocket.OnMessage;
//import javax.websocket.OnOpen;
//import javax.websocket.Session;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.*;
//import java.util.concurrent.ConcurrentLinkedQueue;
//
///**
// * WebSocket服务使用 Java EE WebSocket API 的实现，适用于 Spring Boot 项目中的 WebSocket 端点。
// * 当您使用 @ServerEndpoint 注解时，
// * 这是 Java EE 的标准方式来实现 WebSocket。这种实现是与 Java EE WebSocket 相关联的
// */
//@Component
//@ServerEndpoint("/ws/{sid}")
//public class WebSocketServer0 {
//
//    //存放会话对象
//    private static Map<String, Session> sessionMap = new HashMap();
//
//    /**
//     * 连接建立成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session) {
//        String sid = UUID.randomUUID().toString(); // 生成唯一 ID
//        System.out.println("客户端(WebSocket.html) 建立连接, 分配 ID：" + sid);
//        sessionMap.put(sid, session);
//
//        // 在这里可以回应消息，同时把 ID 返回给客户端
//        try {
//            session.getBasicRemote().sendText("你的 ID 是：" + sid);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message 客户端发送过来的消息
//     */
//    @OnMessage
//    public void onMessage(String message, @PathParam("sid") String sid) {
//        System.out.println("收到来自客户端：" + sid + "的信息:" + message);
//        // 检查消息内容是否为 "close-jar"
//        if ("close-jar".equals(message)) {
//            // 执行关闭java进程的代码
//            System.out.println("关闭java");
//            System.exit(0);
////            closeJarProcess();
//        }
//    }
//    private void closeJarProcess() {
//        try {
//            // 定义批处理命令
//            String command = "cmd /c for /f \"tokens=5\" %%a in ('netstat -ano ^| findstr \":8085\" ^| findstr LISTENING') do ( taskkill /PID %%a /F )";
//
//            // 执行批处理命令
//            Process process = Runtime.getRuntime().exec(command);
//
//            // 等待命令执行完成
//            int exitCode = process.waitFor();
//            if (exitCode == 0) {
//                System.out.println("8085 端口的进程已成功关闭");
//            } else {
//                System.out.println("关闭 8085 端口的进程失败，退出代码：" + exitCode);
//            }
//        } catch (IOException | InterruptedException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    /**
//     * 连接关闭调用的方法
//     *
//     * @param sid
//     */
//    @OnClose
//    public void onClose(@PathParam("sid") String sid) {
//        System.out.println("连接断开:" + sid);
//        sessionMap.remove(sid);
//    }
//
//    private final Queue<String> messageQueue = new ConcurrentLinkedQueue<>();
//
//    /**
//     * 群发
//     * @param message
//     *///, Set<Session> sessions
//    public void sendToAllClient(String message) {
//        Collection<Session> sessions = sessionMap.values();
//        List<Session> closedSessions = new ArrayList<>();
//        for (Session session : sessions) {
//            if (session != null && session.isOpen()) {
//                try {
//                    // 将消息添加到队列中
//                    messageQueue.offer(message);
//                    // 发送队列中的消息
//                    sendFromQueue(session);
//                } catch (IOException e) {
//                    // 记录日志，可能是发送失败
//                    e.printStackTrace();
//                }
//            } else {
//                closedSessions.add(session);
//            }
//        }
//
//        if (!closedSessions.isEmpty()) {
//            restartClosedSessions(closedSessions);
//        }
//    }
//
//    private void sendFromQueue(Session session) throws IOException {
//        while (!messageQueue.isEmpty()) {
//            String message = messageQueue.poll();
//            if (message != null) {
//                // 检查会话状态
//                if (session.isOpen()) {
//                    session.getBasicRemote().sendText(message);
//                } else {
//                    // 处理已关闭的会话
//                    session.close();
//                }
//            }
//        }
//    }
//
//    //可以有一种机制，让客户端检测到连接断开后自动重新连接（比如前端 JS 代码里写重连逻辑）。
//    //服务器端通常不主动“重启”连接，只负责维护连接列表，清理无效连接。
//    //最好的实践是清理关闭的 Session，确保服务器资源干净。
//    //客户端实现自动重连，确保连接持续。
//    private void restartClosedSessions(List<Session> closedSessions) {
//        for (Session session : closedSessions) {
//            // 从 sessionMap 移除关闭的 Session
//            sessionMap.values().remove(session);
//            sessionMap.remove(session);
//            // 也可以在这里写日志或其他处理操作
//            System.out.println("Removed closed WebSocket session: " + session.getId());
//        }
//        // 通知或者日志记录
//        System.out.println("Closed sessions cleaned up. Waiting clients to reconnect.");
//    }
//
//}
